/**
 * TetisDB
 *
 * Implementacao padrao de TetisSession
 */

package br.com.tetisdb.domain.session;

import br.com.tetisdb.domain.TetisDomain;
import br.com.tetisdb.io.snapShot.SnapShotManager;
import br.com.tetisdb.lang.TetisObject;
import br.com.tetisdb.query.TQuery;
import br.com.tetisdb.query.TetisQuery;
import java.util.ArrayList;
import java.util.List;

public class TSession extends TetisObject implements TetisSession {
    // nome do usuario
    private String user;
    // se esta fechado
    private boolean close;
    // lista de TetisQuery
    private List<TetisQuery> listaQuery;
    //snapshot manager
    private SnapShotManager snapShotManager;
    
    /**
     * Construtor Padrao
     *
     * @param snapShotManager SnapShotManager para a sessao que vai ser criada
     * @param user Nome do Usuario.
     */
    public TSession(SnapShotManager snapShotManager, String user) {
        tetisLogger.info("Criando Sessao para o Usuario: "+user);
        this.user = user;
        this.snapShotManager = snapShotManager;
        listaQuery = new ArrayList();
    }
    
    /**
     * Resgata o Nome do Usuario.
     *
     * @return String Nome do Usuario.
     */
    public String getUser() {
        return user;
    }
    
    /**
     * Adiciona um objeto ao TetisDB
     *
     * @param obj Objeto a ser adicionado.
     * @return Object Objeto adicionado.
     */
    public Object set(Object obj) {
        return snapShotManager.set(obj);
    }
    
    /**
     * Forca a criacao de um SnapShot
     */
    public void takeSnapShot() {
        try {
            tetisLogger.debug("Criando SnapShot");
            snapShotManager.takeSnapShot();
        } catch (Exception e) {
            tetisLogger.error("Erro ao criar SnapShot. Erro: "+e.getMessage(), e);
        }
    }
    
    /**
     * Retorna o TetisDomain a que esse Usuario pertence.
     *
     * @return TetisDomain Dominio que esse Usuario pertence.
     */
    //public TetisDomain getDomain() {
    //   return domain;
    //}
    
    /**
     * Verifica se a Sessao esta valida.
     *
     * @return boolean Se esta valida.
     */
    public boolean isClose() {
        return close;
    }
    
    /**
     * Fecha um TetisSession
     */
    public void close() {
        tetisLogger.info("Fechando TetisSession: " + this);
        close = true;
    }
    
    /**
     * Cria um TetisQuery para esse Usuario
     *
     * @param clazz Classe do objeto a ser pesquisado.
     * @return TetisQuery Query criada.
     */
    public TetisQuery createQuery(Class clazz) {
        tetisLogger.debug("Criando TetisQuery para o Usuario: "+user);
        TetisQuery query = new TQuery(clazz, snapShotManager.getSnapShot());
        //listaQuery.add(query);
        tetisLogger.debug("TetisQuery criado") ;
        return query;
    }
}
